草庐IT

Android ArrayList迭代

全部标签

c++ - 具有 O(1) 插入(分摊)和 O(n) 迭代的容器

我正在寻找具有以下基本属性的类似集合的容器类:已摊销O(1)插入时间,忽略重复插入有O(n)次迭代时间(特别是O(capacity)是NotAcceptable)重用内存/仅在超出当前容量时分配用例是我有一个更大的对象容器。在每个循环期间,我会将这些对象的一个​​子集添加到这个新容器中。此子集可以来自1-5个对象或最多占整个集合的10%。然后我迭代这个新集合中的对象。每个循环对象将被清除并重新开始处理。我最初的方法是在对象上使用侵入式bool值来指示它是否属于这个新集合。因此插入是真正的恒定时间,并且它不使用新的内存。然而,迭代是次优的。我已经尝试了boost::unordered_s

c++ - STL 迭代器 : container. 结束()

我正在阅读一些关于STL的文档,那里写到end()函数返回容器最后一个元素旁边字节的迭代器。我想知道,如果容器占用了整个可用内存的最后一个字节怎么办。那会发生什么? 最佳答案 C++内存模型保证您始终可以形成指向数组最后一个元素之后的元素的指针。如果没有,系统将不允许您在此位置分配对象,或者它会环绕。另外,请注意,这对于数组来说是一个潜在的问题,因为其他容器可以使用迭代器类型,这些迭代器类型以其他合适的形式处理结束位置:它们完全控制增量操作的工作方式。 关于c++-STL迭代器:cont

c++ - 指针迭代器的取消引用适配器

我有一个容器,负责管理一组属性。该类部分看起来像这样:classAttributeSet{public://...interfaceisirrelevantformyquestion.private:std::vector>m_attributes;};属性是多态的,因此属性必须存储为指针,但它们永远不能为NULL。我想将此类与BOOST_FOREACH一起使用,如下所示:BOOST_FOREACH(constAttribute&attribute,attributeSet){...}根据BOOST_FOREACH文档,ThesupportforSTLcontainersisveryg

C++通过迭代器更新 vector 元素

我正在实现就地合并排序,因此我需要在不创建新容器的情况下更新vector容器元素。我正在遍历容器,没有vector容器作为参数。我只传递目标容器的迭代器。我的问题是“如何仅通过该vector容器的迭代器更新或替换vector容器元素?”以下是我的部分代码。templatevoidit_practice(Tbegin,Tend){for(Tit=begin;it!=end;++it){if(R_half[j]>=L_half[i]){*it=L_half[i];i++;}else{*it=R_half[j];j++;}} 最佳答案 *

c++ - 如果提供了正确的迭代器提示,map/set::insert 的复杂性是多少?

是O(1)还是O(logN)但系数较小?如果未指定,我至少想知道基于map/集合是使用红黑树或AVL树实现的合理假设的答案。我认为插入元素的一般算法是这样的:找到正确的位置-O(logN)做实际的插入-?必要时重新平衡树-?现在,如果我们提供正确的迭代器提示,那么第一步就变成了O(1)。其他步骤也是O(1)还是O(logN)? 最佳答案 标准没有说明容器是如何实现的,所以你不能指望RB或AVL树。在实践中......复杂性约束是这样的,我不知道任何其他实现这符合要求。但正是在复杂性的限制下你会找到答案:“一般来说是对数的,但摊销如果

c++ - 如何迭代/计数 multimap<string,string>

我的课是这样的:classOutgoing{multimapoutgoing;public:voidmakeConnection(stringkey,stringvalue){outgoing.insert(pair(key,value));}voiditerate(){multimap::iteratorit;multimap::iteratorit2;pair::iterator,multimap::iterator>ret;for(it=outgoing.begin();it!=outgoing.end();++it){ret=outgoing.equal_range((*it)

iphone - Objective C 中两种迭代方式的区别?

我对两种迭代方式有一些疑问。NSArray*array=[[NSArrayalloc]initWithObjects:@"A",@"B",@"C",@"D",nil];NSMutableArray*mutArray=[[NSMutableArrayalloc]initWithArray:array];当我这样做时,它就可以正常工作了for(inti=0;[mutArraycount]!=0;){[mutArrayremoveObjectAtIndex:i];}NSLog(@"%d,",[mutArraycount]);但是当我这样做时,它会崩溃...为什么?for(idobjinmut

ios - 在迭代之前复制集合是否足以防止同步问题?

我有一个sessions属性,一个可变的集合。我需要遍历集合,但同时我可以用另一种方法更改集合:-(Session*)sessionWithID:(NSString*)sessionID{for(Session*candidatein_sessions){/*dosomething*/}returnnil;}-(void)doSomethingElse{[_sessionsremoveObject:…];}这不是线程安全的。防弹版本将使用@synchronized或调度队列来序列化_sessions访问。但是,在迭代之前简单地复制集合有多合理?-(Session*)sessionWit

ios - 如何在 ios 中迭代 JSON 对象

我这样创建json对象idjson=[NSJSONSerializationJSONObjectWithData:data选项:kNilOptions错误:&error];但是文档没有告诉我如何通过键和值循环json对象。 最佳答案 这是一种方法。如果您的问题更具体,我很乐意了解更多细节。NSString*jsonString=@"[{\"id\":\"1\",\"name\":\"Aaa\"},{\"id\":\"2\",\"name\":\"Bbb\"}]";NSData*data=[jsonStringdataUsingEnc

ios - 为什么快速枚举比普通迭代更快?

我知道什么是快速枚举及其在Objective-C中的用途。我想知道为什么快速枚举比普通迭代更快? 最佳答案 它是一种更高层次的语言结构,因此它可以做更好的优化:例如,考虑迭代一个NSArray:for(NSUIntegeri=0;i对于每个迭代,有两个方法调用。.count是一个方法调用。.objectAtIndex是一个方法调用。方法调用很慢。虽然我们可以修复第一个,例如NSUIntegercount=[arraycount];for(NSUIntegeri=0;i我们无法修复第二个。快速枚举可以将项目加载到C数组中并快速迭代它们